package cn.net.Stream;
/*两种字节输入流读取案例
* 高效和普通，均可以，二选一
* */
import java.io.*;
//文件路径："D:\\File\\1.txt"
//文件内容：abc
public class TestIn {
    public static void main(String[] args)  {
      //  method();//1.调用方法一来测试【高效字节输入流读取】

        method2();//2.调用方法二来测试【普通字节输入流读取】
    }

    private static void method2()  {
        /**2.1 声明字节输入流的初始值为null*/
        InputStream in =null;

        try {
            //InputStream in = new InputStream();//注意踩坑报错:InputStream是字节流读取的【父类,而且是抽象类】不能new创建对象
            //InputStream in = new FileInputStream(new File("D:\\File\\1.txt"));//传入的是File对象

            /**2.2.创建【普通】字节流的读取对象  */
            in = new FileInputStream("D:\\File\\1.txt");/**2.3  try/catch*/
            /***2.4重复的读取文件中的所有字节**/
            int b ;//2.4.1定义变量,记录读到的数据
            while((b = in.read()) != -1) {//2.4.2返回值为-1的时候,表示没有数据了,循环结束
                System.out.println(b);//2.4.3打印每次循环读取到的内容：97，98，99
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            /**2.5 释放资源 */
            try {
                in.close();/*2.6 可以用try/catch模块*/
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void method()  {
        /**1.1.finally必须声明局部变量并初始化为null**/
        InputStream in = null;
        try {

            //BufferedInputStream（）是高效的读取流,原因在于底层维护了一个byte[]*/
            //InputStream in = new BufferedInputStream(new FileInputStream(new File("D:\\ready\\1.txt")));
            /**1.2.创建【高效】字节流的读取对象 */
             in = new BufferedInputStream(new FileInputStream("D:\\File\\1.txt"));/*1.3 try/catch*/
            /*1.4:读取文件的内容，重复读取所有字节*/
            int b;//声明变量值保存
            while((b=in.read())!=-1){//注意括号。调用in.read()方法,while循环判断条件
                System.out.println(b);//97//98///99
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {

            try {
                /**1.5.释放资源**/
                in.close();/*1.6需要try/catch*/
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
/*
总结： 1.调用方法；分普通和高效
      2.try/catch模块:try铺货异常+catch抛出异常
      3.创建字节流对象，【普通：new FileInputStream（）/高效：new BufferedInputStream（new FileInputStream（））】
      4.读取方法【法一：read()依次读取，法二：while循环读取】
      5.finally模块，通过使用try/catch或throws向上抛出异常来释放资源。
      6.在方法下【声明局部变量初始化为null】。

 */



    }
}
